/**
给定一个二叉树，确定它是否是一个完全二叉树。

百度百科中对完全二叉树的定义如下：

若设二叉树的深度为 h，除第 h 层外，其它各层 (1～h-1) 的结点数都达到最大个数，第 h 层所有的结点都连续集中在最左边，这就是完全二叉树。（注：第 h 层可能包含 1~ 2h 个节点。）

 

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/check-completeness-of-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。


 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

/////////////////////////////////////////////////////////////////////////////////
//解法一
 /* 利用完全二叉树的特性
 node : i
 node->left : i*2 + 1
 node->right : i*2 + 2
 */

class Solution {
public:
    void Travel_Level(TreeNode* root,vector<long int> &arr)
    {
        if(root == 0) 
            return;
        deque<TreeNode*> myDeque;
        arr.push_back(0);
        myDeque.push_back(root);
        int index = 0;
        while(!myDeque.empty())
        {
            TreeNode* node = myDeque.front();
            int indexValue = arr[index];

            if(node->left)
            {
                arr.push_back(indexValue*2 + 1);
                myDeque.push_back(node->left);
            }
            if(node->right)
            {
                arr.push_back(indexValue*2 + 2);
                myDeque.push_back(node->right);
            }
            myDeque.pop_front();
            index ++;
        }
    }
    bool isCompleteTree(TreeNode* root) {
        if(root == 0)
            return false;
        vector<long int> arr;
        Travel_Level(root,arr);
        for(int i=0;i<arr.size();i++)
        {
            if(arr[i] != i)
                return false;
        }
        return true;
    }
};


/////////////////////////////////////////////////////////////////////////////////
//解法二
